/*******************************************************************************
** 文件名称：gm_pm.c
** 文件作用：通用页面管理
** 编写作者：Tom Free 付瑞彪
** 编写时间：2020-07-02
** 文件备注：负责管理页面，处理页面事件和页面切换的初始化以及后处理
**			 
**			 
** 更新记录：
**          2020-07-02 -> 创建文件                          <Tom Free 付瑞彪>
**
**              Copyright (c) 2018-2020 付瑞彪 All Rights Reserved
**
**       1 Tab == 4 Spaces     UTF-8     ANSI C Language(C99)
*******************************************************************************/

#include "gm_pm.h"

/*******************************************************************************
** 函数名称：GM_PM_Init
** 函数作用：初始化页面管理
** 输入参数：pm - 页面管理器指针
** 输出参数：处理结果
** 使用范例：GM_PM_Init(&pm);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Init(GM_PM* pm)
{
    size_t i;
    GM_PM_RESULT reult = GM_PM_RESULT_SUCCESS;

    if ((pm == NULL) ||
        (pm->cur_page == NULL) ||
        (pm->page_num == 0) ||
        (pm->page_ptr_arr == NULL))
    {
        /* 参数不合法 */
        reult = GM_PM_RESULT_INVALID_PARAM;
    }
    else
    {
        for (i = 0; i < pm->page_num; i++)
        {
            /* 前一个清空 */
            pm->page_ptr_arr[i]->Previous = NULL;
            /* 回调Init函数 */
            if (pm->page_ptr_arr[i]->Init != NULL)
            {
                pm->page_ptr_arr[i]->Init();
            }
        }
    }
   
    return reult;
}

/*******************************************************************************
** 函数名称：GM_PM_Start
** 函数作用：启动页面管理
** 输入参数：pm - 页面管理器指针
** 输出参数：启动结果
** 使用样例：GM_PM_Start(&pm);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Start(GM_PM* pm)
{
    GM_PM_RESULT reult = GM_PM_RESULT_SUCCESS;

    if ((pm == NULL) ||
        (pm->cur_page == NULL))
    {
        /* 参数不合法 */
        reult = GM_PM_RESULT_INVALID_PARAM;
    }
    else if (pm->cur_page->Load != NULL)
    {
        /* 回调Load函数 */
        reult = pm->cur_page->Load();
    }

    return reult;
}

/*******************************************************************************
** 函数名称：GM_PM_Exec
** 函数作用：执行页面管理，处理事件
** 输入参数：pm - 页面管理器指针
**           pEvent - 事件指针
** 输出参数：处理结果
** 使用样例：GM_PM_Exec(&pm, &event);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Exec(GM_PM* pm, GM_PM_EVENT* pEvent)
{
    GM_PM_RESULT reult = GM_PM_RESULT_SUCCESS;

    if ((pm == NULL) ||
        (pm->cur_page == NULL))
    {
        /* 参数不合法 */
        reult = GM_PM_RESULT_INVALID_PARAM;
    }
    else if (pm->cur_page->Exec != NULL)
    {
        /* 回调Exec函数 */
        reult = pm->cur_page->Exec(pEvent);
    }

    return reult;
}

/*******************************************************************************
** 函数名称：GM_PM_Enter
** 函数作用：进入一个页面
** 输入参数：无
** 输出参数：处理结果
** 使用范例：GM_PM_Enter(&pm, &page);
** 函数备注：此处的切换必须保证不要重入，否则会出意外
*******************************************************************************/
GM_PM_RESULT GM_PM_Enter(GM_PM* pm, GM_PAGE* page)
{
    GM_PM_RESULT reult = GM_PM_RESULT_SUCCESS;

    if ((pm == NULL) ||
        (page == NULL) ||
        (pm->cur_page == NULL) ||
        (pm->cur_page->Previous != NULL))
    {
        /* 参数不合法 */
        reult = GM_PM_RESULT_INVALID_PARAM;
    }
    else
    {
        page->Previous = pm->cur_page;
        pm->cur_page = page;
        if (pm->cur_page->Load != NULL)
        {
            reult = pm->cur_page->Load();
        }
    }

    return reult;
}

/*******************************************************************************
** 函数名称：GM_PM_Exit
** 函数作用：退出当前页面，自动返回到历史的上一个页面
** 输入参数：pm - 页面管理器指针
** 输出参数：处理结果
** 使用范例：GM_PM_Exit(&pm);
** 函数备注：
*******************************************************************************/
GM_PM_RESULT GM_PM_Exit(GM_PM* pm)
{
    GM_PM_RESULT reult = GM_PM_RESULT_SUCCESS;
    GM_PAGE* page;

    if ((pm == NULL) ||
        (pm->cur_page == NULL) ||
        (pm->cur_page->Previous == NULL))
    {
        /* 参数不合法 */
        reult = GM_PM_RESULT_INVALID_PARAM;
    }
    else
    {
        /* 保存前一个 */
        page = pm->cur_page->Previous;
        /* 当前页面前一个清空 */
        pm->cur_page->Previous = NULL;
        /* 当前页面切换 */
        pm->cur_page = page;
        /* 执行页面加载 */
        if (pm->cur_page->Load != NULL)
        {
            reult = pm->cur_page->Load();
        }
    }

    return reult;
}
